package configuracion;

import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import sesion_beans.AdministrativoEJBLocal;
import sesion_beans.ProgramaEJBLocal;
import vos.Administrativo;
import vos.Programa;

@ManagedBean
@ViewScoped
public class AdministrativoBean {


	//-------------------------------------------------------------------------
	// Atributos
	//-------------------------------------------------------------------------
	
	@EJB(name = "AdministrativoEJB/local")
	private AdministrativoEJBLocal administrativoEJB;
	
	@EJB(name = "ProgramaEJB/local")
	private ProgramaEJBLocal programaEJB;
	
	/** Es el administrativo */
	private Administrativo administrativo = new Administrativo();
	
	/** Es el nombre del programa */
	private String programa;
	
	/** Es la accion a realizar */
	private String accion = "registrar";
	
	//-------------------------------------------------------------------------
	// Metodos
	//-------------------------------------------------------------------------
	
	/**
	 * Obtiene el programa del estudiante
	 * @return progrma El programa del estudiante que se quiere obtener
	 */
	public String getPrograma() {
		return programa;
	}

	/**
	 * Asigna el programa al estudiante
	 * @param programa El programa que se va a asignar
	 */
	public void setPrograma(String programa) {
		this.programa = programa;
	}

	/**
	 * Obtiene el administrativo
	 * @return administrativo El administrativo que se quiere obtener
	 */
	public Administrativo getAdministrativo() {
		return administrativo;
	}

	/**
	 * Asigna un administrativo
	 * @param estudiante El administrativo que se va a asignar
	 */
	public void setAdministrativo(Administrativo administrativo) {
		this.administrativo = administrativo;
	}
	
	/**
	 * Obtiene todos los administrativo de la base de datos
	 * @return La lista de administrativo que estan registrados en la base de datos
	 */
	public List<Administrativo> getAdministrativos(){
		return administrativoEJB.obtenerAdministrativos();
	}
	
	/**
	 * Agrega un administrativo a la base de datos
	 */
	public void adicionarAdministrativo(){
		try {
			Programa programabus = programaEJB.buscar(this.programa+"");
			System.out.println(programa);
			administrativo.setPrograma(programabus);
			administrativo.setTipoPersona("Administrativo");
			System.out.println(administrativo.getTipoPersona()+"");
			administrativoEJB.adicionar(administrativo);
			agregarAdministraitvoPrograma(administrativo, programabus);
			programaEJB.actualizar(programabus);
			administrativo = new Administrativo();
			FacesMessage mensaje = new FacesMessage("El administrativo ha sido agregado");
			FacesContext.getCurrentInstance().addMessage(null, mensaje);
		} catch (Exception e) {
			FacesMessage mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR ,"El administrativo ya existe","El administrativo ya existe");
			FacesContext.getCurrentInstance().addMessage(null, mensaje);
		}
		
	}
	
	
	/**
	 * Elimina un administrativo de la base de datos
	 * @return la pagina que se redireccionara
	 */
	public String eliminarAdministrativo(){
		administrativo = (Administrativo)FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("administrativo");
		return "/Paginas/paginasEliminar/eliminarAdministrativo.xhtml";
	}
	
	/**
	 * Elimina un administrativo de la base de datos
	 * @return la pagina que se redireccionara
	 */
	public String eliminarAdministrativoDeBD(){
		System.out.println(administrativo.getCedula());
		administrativoEJB.eliminar(administrativo);
		FacesMessage mensaje = new FacesMessage("El administrativo ha sido eliminado");
		FacesContext.getCurrentInstance().addMessage(null, mensaje);
		return "/Paginas/paginasAgregar/agregarAdministrativo.xhtml";
	}
	
	/**
	 * Actualiza un administrativo
	 * @return la pagina que se redireccionara
	 */
	public String actualizarAdministrativo(){
		administrativo = (Administrativo)FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("administrativo");
		return "/Paginas/paginasActualizar/actualizarAdministrativo";
	}
	
	/**
	 * Actualiza un administrativo
	 */
	public void actualizarAdministrativoDeBD(){
		administrativoEJB.actualizar(administrativo);
		FacesMessage mensaje = new FacesMessage("El administrativo ha sido actualizado");
		FacesContext.getCurrentInstance().addMessage(null, mensaje);
		administrativo =  new Administrativo();
		accion = "registrar";
	}

	/**
	 * Obtiene la interfaz local de un administrativo
	 * @return La interfaz local de un administrativo
	 */
	public AdministrativoEJBLocal getAdministrativoEJB() {
		return administrativoEJB;
	}
	
	/**
	 * Asigna la interfaz local de un administrativo
	 * @param administrativoEJB La interfaz local de un administrativo
	 */
	public void setAministrativoEJB(AdministrativoEJBLocal administrativoEJB) {
		this.administrativoEJB = administrativoEJB;
	}
	
	/**
	 * Agrega un administrativo a un programa dado como parametro
	 * @param administrativo El administrativo que se va a agregar al programa
	 * @param programa El programa al cual se le va a agregar el estudiante
	 */
	private void agregarAdministraitvoPrograma(Administrativo administrativo, Programa programa){
		List<Administrativo> administrativos = programaEJB.obtenerAdministrativos(programa.getNombre());
		administrativos.add(administrativo);
		programa.setAdministrativos(administrativos);
	}
	
	
	/**
	 * Modifica la accion a realizar
	 */
	public void cancelar(){
		accion = "registrar";
		administrativo = new Administrativo();
	}

	/**
	 * Obtiene la accion a realizar
	 * @return La accion a realizar
	 */
	public String getAccion() {
		return accion;
	}

	/**
	 * Asigna la accion a realizar
	 * @param accion La accion a realizar
	 */
	public void setAccion(String accion) {
		this.accion = accion;
	}

}
